function ajax(options) {
    // options 是个对象
    // - url, type, data, success
    options = options || {}

    // 1. 连接
    let xhr = new XMLHttpRequest()

    // 类型
    options.type = options.type || 'get'
    // 是否异步
    options.async = options.async || true

    // 处理数据
    // data = { username: 'abc', password: '123456' } 
    // 转换成 username=abc&password=123456

    let arr = []

    for (let attr in options.data) {
        // console.log(attr)           // 属性名
        // console.log(options.data[attr]) // 属性值
        arr.push(attr + '=' + options.data[attr])
    }

    let str = arr.join('&')

    // 防止用户大小写出错我们需要把所有字母转成小写
    if (options.type.toLowerCase() === 'get') {
        // 2. 请求
        // 地址?username=abc&password=123456
        xhr.open('GET', options.url + '?' + str, options.async)
        // 3. 发送
        xhr.send()
    } else {
        // 2. 请求
        xhr.open('POST', options.url, options.async)
        // 3. 发送
        xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
        // 直接把参数放到send里就可以了
        // username=abc&password=123456
        xhr.send(str)
    }

    // 4. 接收
    // xhr.onload = function () {
    //     options.success && options.success(xhr.responseText)
    // }
    // onreadystatechange 监听
    xhr.onreadystatechange = function () {
        // 状态码
        // 0 连接
        // 1 请求
        // 2 发送完成
        // 3 接收数据并解析
        // 4 完成
        if (xhr.readyState === 4) {
            // http状态码
            if (xhr.status === 200) {
                options.success && options.success(xhr.responseText)
            } else {
                options.error && options.error(xhr.status + ':' + xhr.responseText)
            }
        }
    }
}

function pAjax(options) {
    return new Promise(function (resolve, reject) {
        ajax({
            url: options.url,
            type: options.type || 'GET',
            data: options.data || {},
            async: options.async || true,
            success (res) {
                resolve(res)
            },
            error (err) {
                reject(err)
            }
        })
    })
}